home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 111_01 / fls.c < prev    next >
Text File  |  1985-08-19  |  4KB  |  136 lines

  1. /*
  2. HEADER:        ;
  3. TITLE:        File list specifier;
  4. VERSION:    1.1;
  5. DATE:        06/16/1981;
  6.  
  7. DESCRIPTION:    "A useful program, which converts ambiguous file names
  8.         in a command line to lists of specific file names,
  9.         for input to another program in the same command line.
  10.         See SQUEEZER.DOC for details.";
  11.  
  12. KEYWORDS:    wildexp, dio;
  13. SYSTEM:        CP/M-80;
  14. FILENAME:    FLS.C;
  15. WARNINGS:    "Programs called by fls.c must be able to accept
  16.         directed input.";
  17. SEE-ALSO:    SQ.C, USQ.C, SQUEEZER.DOC;
  18. AUTHORS:    Dick Greenlaw;
  19. COMPILERS:    BDS C;
  20. */
  21. /************************************************************************/
  22.  
  23. #define VERSION "1.1   06/16/81"
  24. #define STDERR    4    /* Error output stream (always console) */
  25.  
  26. #include <bdscio.h>
  27. #include <dio.h>
  28.  
  29. #define SRCH 17 /*bdos search for file pattern*/
  30. #define SRCHNXT 18
  31. #define SETDMA 26
  32. #define TBUFF (0x80+BASE)    /*default disk buffer*/
  33.  
  34. struct fcb {        /* File control block */
  35.     char xxx[36];    /* enough for CP/M 2 */
  36. };
  37.  
  38.  
  39. main(argc, argv)
  40. int argc;
  41. char *argv[];
  42. {
  43.     int i,c;
  44.     int getchar();        /* Directed io version */
  45.     int putchar();        /* Directed io version */
  46.     char inparg[16];    /* parameter from input */
  47.  
  48.     dioinit(&argc, argv);    /* obey directed to args */
  49.  
  50.     fprintf(STDERR, "Parameter list builder - Version %s by\n\tRichard Greenlaw\n\t251 Colony Ct.\n\tGahanna, Ohio 43230\n", VERSION);
  51.     fprintf(STDERR, "Accepts redirection and pipes.\nOmit other parameters for help and prompt\n\n");
  52.  
  53.     /* Process the parameters in order */
  54.     for(i = 1; i < argc; ++i)
  55.         obey(argv[i]);
  56.  
  57.     if(argc < 2) {
  58.         fprintf(STDERR, "\nParameters are from command line or (singly) from console input.\n");
  59.         fprintf(STDERR, "Drive names and -options are passed thru.\nAmbiguous file names are expanded. CR or EOF to stop.\n");
  60.         do {
  61.             fprintf(STDERR, "\n*");
  62.             for(i = 0; i < 16; ++i) {
  63.                 if((c = getchar()) == EOF)
  64.                     c = '\n';    /* fake empty (exit) command */
  65.                 if((inparg[i] = c) == '\n') {
  66.                     inparg[i] = '\0';
  67.                     break;
  68.                 }
  69.             }
  70.             if(inparg[0] != '\0')
  71.                 obey(inparg);
  72.         } while(inparg[0] != '\0');
  73.     }
  74.     dioflush();    /* clean up any directed io */
  75. }
  76.  
  77. /*
  78.  * Function to convert an input parameter to a list of
  79.  * output parameters. Drives (d:), options (-string) and
  80.  * specific file names (w/ optional drive) are passed through.
  81.  * Ambiguous file names are expanded (w/ optional drive)
  82.  * or, if not found, are ignored with comment.
  83.  *
  84.  * Any parameter beginning with a '-' and drive: alone
  85.  * are simply passed to the output.
  86.  *
  87.  * Results are sent to standard output (presumably redirected)
  88.  * with one output parameter per line.
  89.  */
  90.  
  91. obey(afnp)
  92. char *afnp;    /* possible ambiguous file name*/
  93. {
  94.     struct fcb sfcb;
  95.     char *p, *q, i, byteaddr;
  96.     int    n;
  97.     char ufn[15];    /* unambiguous file name */
  98.  
  99.     if(*afnp == '-' || (*(afnp + 1) == ':' && *(afnp + 2) == '\0'))
  100.         printf("%s\n", afnp);    /* pass through option or drive */
  101.     /* Try to build CP/M FCB */
  102.     else if(setfcb(&sfcb, afnp) == ERROR)
  103.         fprintf(STDERR, "%s is bad afn\n", afnp);
  104.     else {
  105.         /* Search disk directory for all ufns which match afn*/
  106.         for(n = 0; ; ++n) {
  107.             bdos(SETDMA, TBUFF);
  108.             byteaddr = n ? bdos(SRCHNXT,&sfcb) : bdos(SRCH,&sfcb);
  109.             if(byteaddr == 255)
  110.                 break;
  111.             p = ufn;
  112.             if(*(afnp+1) == ':') {
  113.                 /* Drive spec.*/
  114.                 *p++ = *afnp;
  115.                 *p++ = ':';
  116.             }
  117.  
  118.             /*Copy filename from directory*/
  119.             q = TBUFF + 32 * (byteaddr % 4);
  120.             for(i =8; i; --i)
  121.                 if((*p = 0x7F & *++q) != ' ') ++p;
  122.             *p++ = '.' ;
  123.  
  124.             /*Copy file extent*/
  125.             for(i = 3; i; --i)
  126.                 if((*p = 0x7F & *++q) != ' ') ++p;
  127.             *p = '\0' ;
  128.  
  129.             /* Output result */
  130.             printf("%s\n", ufn);
  131.         }
  132.         if(n == 0)
  133.             fprintf(STDERR, "%s not found - ignored\n", afnp);
  134.     }
  135. }
  136.